/**
 * cart 状态管理模块
 */
const cartModule = {
  namespaced: true, // 启动命名空间使用
  state: {
    // cart: JSON.parse(localStorage.getItem('cart')) || [], // 购物车数组，反序列化
    cart: [],
  },
  getters: {
    /**
     * 计算出是否所有商品都选中
     * @param {*} state
     * @returns
     */
    allChecked(state) {
      return state.cart.every(prod => prod.checked)
    },
    /**
     * 合计金额
     * @param {*} state
     */
    totalMoney(state) {
      return state.cart.reduce((sum, prod) => {
        if (prod.checked) {
          sum += prod.price * prod.amount
        }
        return sum
      }, 0) * 100
    },
    /**
     * 合计数量
     */
    totalAmount(state) {
      return state.cart.reduce((sum, prod) => {
        if (prod.checked) {
          sum += prod.amount
        }
        return sum
      }, 0)
    },
  },
  mutations: { // 同步更新状态数据的 mutation 方法
    /**
     * 加入购物车
     */
    addToCart(state, payload) {
      // 查询在购物车中是否有选购当前的商品
      const product = state.cart.find(prod => prod.id === payload.currentProduct.id)
      // 如果存在当前选购的商品，则叠加数量，否则添加到数组中
      if (product) {
        product.amount += payload.currentProduct.amount
      } else {
        state.cart.push({
          ...payload.currentProduct,
          checked: true, // 是否勾选
        })
      }
    },
    /**
     * 从购物车中移除商品
     */
    removeFromCart(state, payload) {
      state.cart = state.cart.filter(prod => prod.id !== payload.id)
    },
    /**
     * 修改购物车中商品数量
     */
    modifyAmount(state, payload) {
      // 找到购物车中的商品
      const product = state.cart.find(prod => prod.id === payload.id)
      // 修改数量
      product.amount = payload.amount
    },
    /**
     * 修改购物车中商品的选中状态
     */
    modifyChecked(state, payload) {
      // 找到购物车中的商品
      const product = state.cart.find(prod => prod.id === payload.id)
      // 修改选中状态
      product.checked = !product.checked
    },
    /**
     * 修改全选/取消全选
     */
    modifyAllChecked(state, payload) {
      state.cart = state.cart.map(prod => {
        prod.checked = payload.allChecked
        return prod
      })
    },
  },
}

export default cartModule
